home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Games of Daze
/
Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso
/
x2ftp
/
msdos
/
gamesrc
/
spadv
/
title.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1980-01-01
|
5KB
|
189 lines
unit Title;
interface
uses Graph,Crt,Globals;
var
Octave, Tempo :byte;
AllLength,Music : real;
Step : boolean;
procedure ShowTitle;
procedure InitPlay;
procedure Play(ComLin : string);
implementation
procedure InitPlay;
begin
Octave := 2;
AllLength := 1/4;
Tempo := 120;
Music := 7/8;
Step := True;
end;
procedure Play(ComLin : string);
type
ChrSet = set of char;
const
Comms : ChrSet = ['L','M','N','<','>','O','P','S','T'];
Notes : ChrSet = ['A'..'G'];
Appix : ChrSet = ['#','+','-','.'];
Numbers : ChrSet = ['0'..'9'];
var
Ctr : integer;
ComLinPos : byte;
Command : string;
procedure NoSpaces (var Lin : string);
var Tmp : string;
Ctr : byte;
begin
Tmp := '';
for Ctr := 1 to Length (Lin) do
if not (Lin[Ctr] in [' ',',']) then Tmp := Tmp + UpCase(Lin[Ctr]);
Lin := Tmp;
end;
function GetSymbol (Lin : string; LinPos : byte; TrmSet : ChrSet) : string;
var ComLen : byte;
begin
GetSymbol := '';
if Lin [LinPos] in TrmSet then begin
ComLen := 1;
while not (Lin [LinPos+ComLen] in TrmSet) and
not (LinPos+ComLen>255) do Inc (ComLen);
GetSymbol := Copy (Lin,LinPos,ComLen);
end;
end;
function GetNumber (Lin : string; var LinPos : byte) : integer;
var ComLen : byte;
Code,Tmp : integer;
begin
Tmp := 0;
ComLen := 1;
while Lin [LinPos+ComLen] in Numbers do
Inc (ComLen);
Val (Copy (Lin,LinPos,ComLen),Tmp,Code);
Inc (LinPos,ComLen-1);
GetNumber := Tmp;
end;
procedure ProcessCommand (Com : string);
var ThisLen : real;
p : byte;
begin
p := 2;
case Com[1] of
'L' : AllLength := 1/GetNumber (Com,p);
'<' : if Octave > 0 then Dec (Octave);
'>' : if Octave < 9 then Inc (Octave);
'O' : Octave := GetNumber (Com,p);
'P' : begin
NoSound;
ThisLen := AllLength;
if Length(Com)>1 then ThisLen := 1/GetNumber (Com,p);
Delay (Round(ThisLen*(256-Tempo)*15));
end;
'T' : Tempo := GetNumber (Com,p);
'M' : case Com[2] of
'7' : Music := 7/8;
'1' : Music := 1;
'3' : Music := 3/4;
end;
'S' : Step := Boolean (Ord(Com[2])-48);
end;
end;
procedure PlayNote (Com : string);
var Ctr,ThisOct : byte;
Frequency,ThisLen : real;
Note,Dummy : integer;
begin
ThisOct := Octave;
ThisLen := AllLength;
Note := Pos (Com[1], 'C D EF G A B');
Ctr := 2;
while Ctr <= Length(Com) do begin
case Com[Ctr] of
'#','+' : Inc (Note);
'-' : Dec (Note);
'.' : ThisLen := ThisLen * 3/2;
'0'..'9' : ThisLen := 1/GetNumber (Com,Ctr);
end;
Inc (Ctr);
end;
if Note<1 then begin
Dec (ThisOct);
Note := 12;
end else
if Note>12 then begin
Inc (ThisOct);
Note := 1;
end;
Frequency := 32.625;
for Ctr := 1 to ThisOct do
Frequency := Frequency * 2;
for Ctr := 1 to Note - 1 do
Frequency := Frequency * 1.059463094;
if ThisLen <> 0.0 then
begin
if Step then NoSound;
Sound(Round(Frequency));
Delay(Round(ThisLen*(256-Tempo)*15*Music));
end
else Sound(Round(Frequency));
end;
begin
NoSound;
NoSpaces (ComLin);
ComLinPos := 1; Command := '';
repeat
Command := GetSymbol (ComLin,ComLinPos,Comms+Notes);
if KeyPressed and ShwTitle then begin
K1 := ReadKey; Inc (Page);
if Page = 2 then Move (Tit2,Scr,16240);
end;
if (Command <> '') then begin
if Command [1] in Comms then ProcessCommand (Command)
else if Command [1] in Notes then PlayNote (Command);
end;
Inc (ComLinPos, Length (Command));
until (ComLinPos > Length (ComLin)) or ((Page > 2) and ShwTitle);
NoSound;
end;
(***** SHOW TITLE PAGES ****)
procedure ShowTitle;
var PauseTemp : shortint;
begin
PauseTemp := Pause;
Pause := 0;
ShwTitle:=True;
ClearDevice;
Delay (400);
Move (Tit1,Scr,16240); Page := 1;
Play ('t160 l8');
if Page<=2 then repeat
Ctr := 1;
repeat
case Ctr of { Play tune in different octaves }
1 : Octave := 4;
2 : Octave := 6;
3 : Octave := 2;
end;
Play ('d4<gab>cd4<gpgp>e4cdef#g4<gpgp'+
+'>c4dc<bab4>c<bagf#4gabgb4a2>'+
+'d4<gab>cd4<gpgp>e4cdef#g4<gpgp'+
+'>c4dc<bab4>c<baga4bagf#g2<g4p4');
Inc (Ctr);
until (Ctr>3) or (Page>2);
until Page >2;
ShwTitle:=False;
Pause := PauseTemp;
end;
begin
InitPlay;
end.